/* 登录注册相关的接口 */
const express = require('express');

const md5 = require('blueimp-md5');         // 密码加密
const gravatar = require('gravatar');       // 生成随机头像
const jwt = require('jsonwebtoken');        // 使用jwt生成token
const passport = require('passport');       // 使用passport验证token

const User = require('../models/accounts');

const router = express.Router();

const keys = require('../config/mongo').secretOrKey;

/* router.get('/',(req, res) => {
    res.json({msg:'首页'})
}) */

//注册接口
router.post('/register',(req,res) => {
    // 判断当前注册邮箱是否在数据库中已存在,异步请求代码语法采用Promise
    User.findOne({email: req.body.email})
        .then(user => {
            if(user){
                return res.status(400).json("邮箱已被注册！")
            }
            // 生成随机头像，s:指定图片尺寸  r:指定图片格式  d:指定生成图片失败返回
            const avatar = gravatar.url(req.body.email, {s: '200', r: 'pg', d: 'mm'}); 
            const newUser = new User({
                name: req.body.name,
                email: req.body.email,
                avatar: avatar,
                identity: req.body.identity,
                password: md5(req.body.password)
            })
            newUser.save()
                   .then(user => {
                        res.json(user)
                   })
                   .catch(err => {
                       console.log(err)
                   })

        })
})

//登录接口(携带token)
//@desc 返回token （使用jwt(jsonwebtoken) passprot）
router.post('/login',(req,res) => {
    const email = req.body.email;
    const password = req.body.password;
    // 查询数据库判断用户是否存在；如果存在的话，用户密码是否正确
    User.findOne({email})
        .then(user => {
            if(!user){
                return res.status(404).json('用户不存在')
            }
            // 判断输入的密码是否正确
            if(md5(password) == user.password){
                // 使用jwt生成token，并返回
                // jwt.sign('规则','加密名字','过期时间','数据处理箭头函数')
                const rule = {id:user.id,name:user.name,avatar:user.avatar,identity:user.identity};
                jwt.sign(rule,keys,{expiresIn:3600},(err,token) => {
                    if(err) throw err;
                    res.json({
                        msg: true,
                        // 实际开发中，根据返回要验证token前面的 " "中的内容是确定的，固定写法"Bearer "
                        //token: 'wyt' + token
                        token: 'Bearer ' + token
                    })
                })
            }else {
               return res.status(400).json('密码错误')
            }
        })
    
})

//使用token验证，请求当前用户信息
router.get('/current', passport.authenticate("jwt",{session:false}),(req,res) => {
    // 使用passport验证token
    // req异步请求对象可以存放token验证通过后，后台返回回来的信息
    res.json({
        id: req.user.id,
        name: req.user.name,
        email: req.user.email,
        identity: req.user.identity
    });
})

module.exports = router